package codigoGerado;

import java_cup.runtime.*;

%%

%class AnalisadorLexico
%public
%column
%line
%cup

%{
	private Symbol symbol(int type) {
		return new Symbol(type, yyline, yycolumn);
	}
   	
	private Symbol symbol(int type, Object val) {
		return new Symbol(type, yyline, yycolumn, val);
	}

	private void mensagemErro() {
		throw new RuntimeException("Erro L�xico na linha " + yyline + " e coluna " + yycolumn + " . N�o existe padr�o para o lexema: " + yytext());
	}
%}

DIGIT = [0-9]
INTEGER = [-]?({DIGIT})+
REAL = {INTEGER}"."({DIGIT})+

LETTER = [a-zA-Z]
ID = {LETTER}({LETTER} | {DIGIT})*

WhiteSpace=[ \r\n\t\f]
COMMENT="(*"([^\*\)])*"*)"

%%

<YYINITIAL>{
	{WhiteSpace}		{ 											}
	{COMMENT}			{											}

	"AND"				{ return symbol(sym.AND);					}
	"ARRAY"				{ return symbol(sym.ARRAY);					}
	"BEGIN"				{ return symbol(sym.BEGIN);					}
	"BY"				{ return symbol(sym.BY);					}
	"CASE"				{ return symbol(sym.CASE);					}
	"CONST"				{ return symbol(sym.CONST);					}
	"DEFINITION"		{ return symbol(sym.DEFINITION);			}
	"DIV"				{ return symbol(sym.DIV);					}
	"DO"				{ return symbol(sym.DO);					}
	"ELSE"				{ return symbol(sym.ELSE);					}
	"ELSIF"				{ return symbol(sym.ELSIF);					}
	"END"				{ return symbol(sym.END);					}
	"EXIT"				{ return symbol(sym.EXIT);					}
	"EXPORT"			{ return symbol(sym.EXPORT);				}
	"FOR"				{ return symbol(sym.FOR);					}
	"FROM"				{ return symbol(sym.FROM);					}
	"IF"				{ return symbol(sym.IF);					}
	"IMPLEMENTATION"	{ return symbol(sym.IMPLEMENTATION);		}
	"IMPORT"			{ return symbol(sym.IMPORT);				}
	"IN"				{ return symbol(sym.IN);					}
	"LOOP"				{ return symbol(sym.LOOP);					}
	"MOD"				{ return symbol(sym.MOD);					}
	"MODULE"			{ return symbol(sym.MODULE);				}
	"NOT"				{ return symbol(sym.NOT);					}
	"OF"				{ return symbol(sym.OF);					}
	"OR"				{ return symbol(sym.OR);					}
	"POINTER"			{ return symbol(sym.POINTER);				}
	"PROCEDURE"			{ return symbol(sym.PROCEDURE);				}
	"QUALIFIED"			{ return symbol(sym.QUALIFIED);				}
	"RECORD"			{ return symbol(sym.RECORD);				}
	"REPEAT"			{ return symbol(sym.REPEAT);				}
	"RETURN"			{ return symbol(sym.RETURN);				}
	"SET"				{ return symbol(sym.SET);					}
	"THEN"				{ return symbol(sym.THEN);					}
	"TO"				{ return symbol(sym.TO);					}
	"TYPE"				{ return symbol(sym.TYPE);					}
	"UNTIL"				{ return symbol(sym.UNTIL);					}
	"VAR"				{ return symbol(sym.VAR);					}
	"WHILE"				{ return symbol(sym.WHILE);					}
	"WITH"				{ return symbol(sym.WITH);					}
	
	"FINALLY"			{ return symbol(sym.FINALLY);				}
	"EXCEPT"			{ return symbol(sym.EXCEPT);				}
	"UNQUALIFIED"		{ return symbol(sym.UNQUALIFIED);			}
	"VOLATILE"			{ return symbol(sym.VOLATILE);				}
	"REM"				{ return symbol(sym.REM);					}
	"__ATTRIBUTE__"		{ return symbol(sym.__ATTRIBUTE__);			}
	"__BUILTIN__"		{ return symbol(sym.__BUILTIN__);			}
	"__INLINE__"		{ return symbol(sym.__INLINE__);			}
	"ASM"				{ return symbol(sym.ASM);					}
	"PACKEDSET"			{ return symbol(sym.PACKEDSET);				}
	"RETRY"				{ return symbol(sym.RETRY);					}
	
	"ABS"				{ return symbol(sym.ABS);					}
	"BITSET"			{ return symbol(sym.BITSET);				}
	"BOOLEAN"			{ return symbol(sym.BOOLEAN);				}
	"CAP"				{ return symbol(sym.CAP);					}
	"CARDINAL"			{ return symbol(sym.CARDINAL);				}
	"CHAR"				{ return symbol(sym.CHAR);					}
	"CHR"				{ return symbol(sym.CHR);					}
	"DEC"				{ return symbol(sym.DEC);					}
	"EXCL"				{ return symbol(sym.EXCL);					}
	"FALSE"				{ return symbol(sym.FALSE);					}
	"FLOAT"				{ return symbol(sym.FLOAT);					}
	"HALT"				{ return symbol(sym.HALT);					}
	"HIGH"				{ return symbol(sym.HIGH);					}
	"INC"				{ return symbol(sym.INC);					}
	"INCL"				{ return symbol(sym.INCL);					}
	"INTEGER"			{ return symbol(sym.INTEGER);				}
	"LONGINT"			{ return symbol(sym.LONGINT);				}
	"LONGREAL"			{ return symbol(sym.LONGREAL);				}
	"MAX"				{ return symbol(sym.MAX);					}
	"MIN"				{ return symbol(sym.MIN);					}
	"NIL"				{ return symbol(sym.NIL);					}
	"ODD"				{ return symbol(sym.ODD);					}
	"ORD"				{ return symbol(sym.ORD);					}
	"PROC"				{ return symbol(sym.PROC);					}
	"REAL"				{ return symbol(sym.REAL);					}
	"SIZE"				{ return symbol(sym.SIZE);					}
	"TRUE"				{ return symbol(sym.TRUE);					}
	"TRUNC"				{ return symbol(sym.TRUNC);					}
	"VAL"				{ return symbol(sym.VAL);					}
	
	"\"" 				{ return symbol(sym.QUOTES); 				}
	"'" 				{ return symbol(sym.SQUOTES); 				}
	"(" 				{ return symbol(sym.LPAREN); 				}
	")"			 		{ return symbol(sym.RPAREN); 				}
	"="			 		{ return symbol(sym.EQ); 					}
	">"			 		{ return symbol(sym.GT);					}
	"<"			 		{ return symbol(sym.LT); 					}
	">="		 		{ return symbol(sym.GE); 					}
	"<="		 		{ return symbol(sym.LE); 					}
	"<>"		 		{ return symbol(sym.NE); 					}
	"+"			 		{ return symbol(sym.ADD); 					}
	"-" 				{ return symbol(sym.MINUS); 				}
	"*" 				{ return symbol(sym.MULT);					}
	"/"			 		{ return symbol(sym.DIVS);					}
	":"					{ return symbol(sym.COLON); 				}
	";"					{ return symbol(sym.SEMICOLON); 			}
	":="				{ return symbol(sym.ASSIGN); 				}
	"."					{ return symbol(sym.DOT);					}
	","					{ return symbol(sym.COMMA);					}
	"["					{ return symbol(sym.LSQBRACKET);			}
	"]"					{ return symbol(sym.RSQBRACKET);			}
	"..."				{ return symbol(sym.ELLIPSIS);				}
	"#"					{ return symbol(sym.HASH);					}
	".."				{ return symbol(sym.DOTS);					}
	"{"					{ return symbol(sym.LCLBRACKET);			}
	"}"					{ return symbol(sym.RCLBRACKET);			}
	"^"					{ return symbol(sym.CARET);					}
	"<*"				{ return symbol(sym.LTAST);					}
	"*>"				{ return symbol(sym.GTAST);					}
	"&"					{ return symbol(sym.AMPERSAND);				}
	"|"					{ return symbol(sym.VERTBAR);				}

	{ID}				{ return symbol(sym.Ident, yytext()); 			}
	{INTEGER}			{ return symbol(sym.INTNUMBER, yytext());	}
	{REAL}				{ return symbol(sym.REALNUMBER, yytext());	}
}

<<EOF>> 			{ return symbol(sym.EOF); 					}
.|\n 				{ mensagemErro();							}